package practica1.actions;

import java.awt.event.ActionEvent;
import java.util.ArrayList;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import practica1.Practica1;
import practica1.controller.Controller;
import practica1.language.Language;
import practica1.language.LanguageEvent;
import practica1.language.LanguageListener;
import practica1.logic.LogicExperimento;
import practica1.logic.LogicPoblacion;
import practica1.manejoExperimento.ManejoExperimento;

/**
 * Clase que implementa la acción para cerrar un experimento
 * @author Miguel González - Ceura
 */
public class ActionCerrar extends AbstractAction implements LanguageListener {

    /**
     * Constructor de la clase
     */
    public ActionCerrar() {
        super(Language.getI().getP("CERRAR"), null);
        
        putValue(SHORT_DESCRIPTION, Language.getI().getP("CERRAR_EXPERIMENTO"));
        putValue(NAME, Language.getI().getP("CERRAR"));
        putValue(SELECTED_KEY, Boolean.TRUE);
        
        initIdiomaListener();
    }
    
    private void initIdiomaListener() {
        Language.getI().addLanguageListener(this);        
    }
    
    /**
     * Cuando sucede la acción nos encargamos de cerrar el experimento seleccionado
     * @param e ActionEvent Evento producido
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        LogicExperimento exp = Controller.getInstance().
                getExperimentoSeleccionado();
        
        ArrayList<LogicPoblacion> poblacionesSinGuardar = new
                ArrayList<LogicPoblacion>();
        
        if(!exp.isModified()) {
            ArrayList<LogicPoblacion> poblaciones = exp.getPoblaciones();
            for(int i=0; i< poblaciones.size(); i++) {
                if(poblaciones.get(i).isModified()) {
                    poblacionesSinGuardar.add(poblaciones.get(i));
                }
            }
        }
            
        if(exp.isModified() || !poblacionesSinGuardar.isEmpty()) {
            int res = JOptionPane.showConfirmDialog(Practica1.getInstance(), 
                    Language.getI().getP("DESEA_GUARDAR_EXPERIMENTO")
                    , Language.getI().getP("CERRAR"),
                    JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
            if(res == JOptionPane.OK_OPTION) {
                ManejoExperimento.guardarExperimento(exp);
                
                Controller.getInstance().removeExperimento(exp);
            } else if(res == JOptionPane.NO_OPTION) {
                Controller.getInstance().removeExperimento(exp);
            }
        } else {
            Controller.getInstance().removeExperimento(exp);
        }
    }

    /**
     * Al cambiar el idioma actualizamos el nombre y la descripción
     * @param evt LanguageEvent
     */
    @Override
    public void idiomaChange(LanguageEvent evt) {
        putValue(SHORT_DESCRIPTION, Language.getI().getP("CERRAR_EXPERIMENTO"));
        putValue(NAME, Language.getI().getP("CERRAR"));
    }
    
}
